package com.atguigu.webadmin.converter;

import com.atguigu.model.enums.BaseEnum;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;


/**
 * ClassName: StringToBaseEnumConverterFactory
 * Package: com.atguigu.webadmin.converter
 * Description: 自定义的 ConverterFactory（转换器工厂类）
 *
 * @Author 梅超凡
 * @Create 2024/11/14 11:05
 * @Version 1.0
 */
@Component
@Slf4j
public class StringToBaseEnumConverterFactory implements ConverterFactory<String,BaseEnum> {

    /**
     * @Author 梅超凡
     * @Date 2024/11/14~11:17
     * @Description  Class.getEnumConstants() 方法是 Java 反射 API 中的一个方法，
     *              用于获取表示枚举类型的 Class 对象中所有枚举常量的数组
    */
    @NotNull
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(@NotNull Class<T> targetType) {
        return source -> {
            for (T enumConstant : targetType.getEnumConstants()) {
                //校验输入的值是否与枚举常量中的值一致并返回
                if (enumConstant.getCode().equals(Integer.valueOf(source))) {
                    return enumConstant;
                }
            }
            //报错
            log.error("非法的枚举值:{}",source);
            //抛异常
            throw new IllegalArgumentException("非法的枚举值:" + source);
        };
    }
}
